package Day_0214.JVM;

/**
 * @author zxc
 * @date 2023/02/14 22:31
 **/
public class JVM_Major_Component {
    public static void main(String[] args) {
        /**
         * JVM虚拟机的主要组成部分以及其作用
         * ===》
         * 一.JVM包含两个组件和两个系统
         * 1.类加载子系统（Class Loader）：
         * （1）即，根据给定的全限定名类名（例如 ：java.lang.Object），装载class文件到 运行时数据区的方法区中;
         * （2）类加载子系统，是由类加载器组成的;
         * （3）类加载器由高到低的优先级为 ：根类加载器 > 扩展类加载器 > 应用类加载器 > 自定义类加载器;
         * （4）同时，将class文件加载到运行时数据区的方法区时，需要遵循双亲委派机制 ：自底向上委托类加载请求，自顶向下加载类;
         * （5）即，双亲委派机制保证了Java原生类不能够被轻易更改，保证Java原生类库的完整性;
         * （6）类加载子系统，真正作用是将某个类对应的字节码文件加载到JVM中（运行时数据区）;
         *
         * 2.执行引擎子系统（Execution Engine）
         * （1）即，执行classes（字节码文件）中的命令;
         * （2）执行引擎（Execution Engine) 的任务就,是将字节码指令解释/编译为对应平台上的本地机器指令。
         * （3）简单来说，JVM 中的执行引擎充当了将高级语言翻译为机器语言的译者。
         *
         * 3.运行时数据区（RunTime data area）
         * （1）即，包含了专属于每个线程的虚拟机栈，本地方法栈，程序计数器; 同时，包括了线程之间共享的堆 && 方法区;
         * （2）方法区，主要用于存储虚拟机所加载的类信息，静态变量，运行时常量池等等;
         *
         * 4.本地方法接口（Native interface）
         * （1）与native libraries交互，是其它编程语言交互的接口。
         * （2）本地方法接口，能够调用本地方法库（native libraries）。
         *
         * 二，Java代码在JVM虚拟机中执行流程
         * 1.Java源代码被编译器编译成字节码（class）文件;
         *
         * 2.然后，通过类加载器系统，将字节码文件加载到 JVM内存中（运行时数据区，RunTime data area）的方法区中;
         * ===》
         * （1）类加载过程中，包含 ：加载 -> 连接（连接，又包含 验证 -> 准备 -> 解析等等三个阶段） -> 初始化
         *
         * 3.字节码文件只是JVM的指令集合，需要通过 存储引擎系统（Execution Engine），将字节码转化为底层系统指令，将其交给CPU执行;
         * ===》
         * 注意 ：垃圾回收器，是在存储引擎模块的;即，存储引擎调用垃圾回收器，对于JVM运行时数据区中堆进行垃圾回收;
         *
         * 4.同时，Java源代码中，若是进行了系统调用/c语言函数调用的话，即调用 本地方法接口（native interface）;
         *
         * ===》
         * 总结 ：
         * （1）类加载，指的是将类的.class文件中的二进制数据读入到JVM内存中，将其放在运行时数据区的方法区内;
         * （2）然后，在堆区创建一个 java.lang.Class对象，用来封装类在方法区内的数据结构。
         *
         */
    }
}
